package com.lj.queue.handler;

/**
 * @author luojing
 * @since 2025/7/16 18:48
 * 延迟消息处理器，他是一个责任链模式
 * M: 消息的类型
 */
public interface DelayMessageHandler<M> {

    /**
     * 转换要处理的消息
     * 从handlerContext中获取message进行转换成需要的消息类型M
     * 如果转换不了可以抛出异常,说明这个处理器无法处理该延迟消息，会进行跳过执行下一个处理器
     *
     * @param handlerContext 处理器上下文
     * @return 要处理的延迟消息
     * @throws Exception 可以抛出任何的异常
     */
    M convertMessage(DelayHandlerContext handlerContext) throws Exception;

    /**
     * 对延迟消息进行执行
     * 处理器的执行是一个责任链模式，是否要继续执行下一个处理器交由具体的业务
     * 调用{@link DelayHandlerChain#next(DelayHandlerContext)} 可将当前延迟消息传递给下一个处理器，否则只会执行当前处理器
     * 如果需要对下一个处理器的消息做修改调整需要对{@link DelayHandlerContext#getMessage()}字符串做修改而不是 message 因为它不会被传递到下一个处理器中
     *
     * @param handlerContext 处理器上下文
     * @param message        上面处理好了的消息
     * @param handlerChain   处理器调用链
     */
    void execute(DelayHandlerContext handlerContext, M message, DelayHandlerChain handlerChain);
}
